#ifndef NETLIB_TYPES_H
#define NETLIB_TYPES_H

// 管理类型转换类

#include <stdint.h>
#include <string.h>
#include <string>

#ifndef NDEBUG // NDEBUG非调试状态
#include <assert.h>
#endif

namespace netlib
{

using std::string;

inline void memZero(void* p, size_t n) { memset(p, 0, n); }


template<typename T, typename Y>
inline T implicit_cast(Y const &f) { return f; } // 隐式转换标明，提高可读性


template<typename T, typename Y>
inline T down_cast(Y* f) // 向下转型，不依赖RTTI
{
    if (false) // 预防未调用导致编译错误
        implicit_cast<Y*, T>(0);

    // 如果处于调试状态且没有定义GOOGLE_PROTOBUF_NO_RTTI（也就是开启运行时类型识别）
    // 才能向下转型，断言f为空指针(空指针可以随意转换)或者f能够执行向下转型
    #if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
    assert(f == NULL || dynamic_cast<T>(f) != NULL);
    #endif
    return static_cast<T>(f);
}

}  // namespace netlib end

#endif